#include <stdio.h>
#include <stdlib.h>
#include "linkstack.h"

//1.创建一个空的栈
void CreateEpLinkStack(linkstack_t **ptop){
    *ptop=NULL;
}

//2.入栈 data是入栈的数据
// 参数上之所以采用二级指针，因为我们要随着入栈添加新的节点作为头，top需要永远指向当前链表的头，
// 那么修改main函数中的top，我们采用地址传递
int PushLinkStack(linkstack_t **ptop, datatype data){
    linkstack_t* newcode=(linkstack_t*)malloc(sizeof(linkstack_t));
    if(newcode == NULL){
        printf("入栈内存分配失败！\n");
        return -1;
    }
    newcode->data=data;
    newcode->next=*ptop;
    *ptop=newcode;
    printf("插入成功！\n");
    return 1;
}

//3.判断栈是否为空
int IsEpLinkStack(linkstack_t *top){
    return top == NULL;
}

//4.出栈
datatype PopLinkStack(linkstack_t **ptop){
    if(*ptop == NULL){
        printf("栈为空!\n");
        return -1;
    }
    linkstack_t *p=(*ptop)->next;
    (*ptop)->next=NULL;
    free(*ptop);
    *ptop=p;
    printf("出栈成功\n");
    return 1;
}

//5.清空栈
void ClearLinkStack(linkstack_t **ptop){//用二级指针，是因为清空后需要将main函数中的top变为NULL
    while(*ptop != NULL){
        linkstack_t *p=(*ptop)->next;
        (*ptop)->next=NULL;
        free(*ptop);
        *ptop=p;
    }
}

//6.求栈的长度
int LengthLinkStack(linkstack_t *top){//用一级指针，是因为我只是求长度，不需要修改main函数中top指针的指向
    int len=0;
    linkstack_t *ftop=top;
    while(ftop != NULL){
        len++;
        ftop=ftop->next;
    }
    return len;
}

//7.获取栈顶数据,不是出栈,不需要移动main函数中的top，所以用一级指针
datatype GetTopLinkStack(linkstack_t *top){
    if(top == NULL){
        printf("栈为空!\n");
        return -1;
    }
    return top->data;
}